using System;
using System.Collections.Generic;
using System.Text;

using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.DataAccessLayer;
using RRHH.Competencias.Entities;

namespace RRHH.Competencias.Controladores
{
    /// <summary>
    /// Agrupa las operaciones relacionadas con los Procesos
    /// </summary>
    public class GestorProceso
    {
        private IDALProceso persistencia;
        

        public GestorProceso()
        {
            this.persistencia = DALProvider.GetDALProceso();            
        }
       
        /// <summary>
        /// Crea un proceso
        /// </summary>
        /// <param name="proceso">Proceso a crear. Se devuelve el ID del proceso creado</param>
        public void Registrar(Proceso proceso)
        {
            if (proceso == null) throw new Exception("Debe indicar el proceso");

            //TODO: Reglas de negocio

            persistencia.Guardar(proceso);

            if (proceso.Colaboradores.Count > 0)
            {
                foreach (Colaborador colaborador in proceso.Colaboradores)
                {
                    persistencia.AsignarConocedor(colaborador.IdColaborador, proceso.Id);
                }
            }
        }

        /// <summary>
        /// Modifica la informacion disponible de un Proceso
        /// </summary>
        /// <param name="proceso">Proceso a eliminar</param>
        public void Modificar(Proceso proceso)
        {
            if (proceso == null) throw new Exception("Debe indicar el proceso");
            if (proceso.Id <= 0) throw new Exception("Debe indicar el ID del proceso");

            //TODO: Reglas de negocio

            persistencia.Actualizar(proceso);

            if (proceso.Colaboradores.Count > 0)
            {

                persistencia.QuitarConocedores(proceso.Id);

                foreach (Colaborador colaborador in proceso.Colaboradores)
                {
                    persistencia.AsignarConocedor(colaborador.IdColaborador, proceso.Id);
                }
            }
        }

        /// <summary>
        /// Elimina un Proceso
        /// </summary>
        /// <param name="proceso">Proceso a eliminar. Indicar el ID</param>
        public void Eliminar(Proceso proceso)
        {
            if (proceso == null) throw new Exception("Debe indicar el proceso");
            if (proceso.Id <= 0) throw new Exception("Debe indicar el ID del proceso");

            //TODO: Reglas de negocio

            persistencia.Borrar(proceso);
        }

        /// <summary>
        /// Obtiene los datos de un Proceso
        /// </summary>
        /// <param name="proceso">Proceso a completar. Indicar el ID</param>
        public void Completar(Proceso proceso)
        {
            if (proceso == null) throw new Exception("Debe indicar el proceso");
            if (proceso.Id <= 0) throw new Exception("Debe indicar el ID del proceso");

            persistencia.Completar(proceso);

            GestorColaborador gestorColaborador = new GestorColaborador();
            
            List<Colaborador> lstColaborador = new List<Colaborador>();
            
            gestorColaborador.ObtenerListadoPorProceso(proceso);

        }

         /// <summary>
        /// Obtiene los datos de un Proceso. No obtiene la informacion de los objetos referencia
        /// </summary>
        /// <param name="proceso">Proceso a completar. Indicar el ID</param>
        public void CompletarBasico(Proceso proceso)
        {
            if (proceso == null) throw new Exception("Debe indicar el proceso");
            if (proceso.Id <= 0) throw new Exception("Debe indicar el ID del proceso");

            persistencia.Completar(proceso);
        }

        /// <summary>
        /// Recupera un listado de todos los procesos registrados
        /// </summary>
        /// <returns>Listado con todos los procesos</returns>
        public List<Proceso> ObtenerListadoCompleto()
        {
            return persistencia.BuscarTodos();
        }

        public List<Proceso> BuscarTodos()
        {
            try
            {
                return persistencia.BuscarTodos();
            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }
        }

        public List<Proceso> Buscar(Proceso proceso)
        {
            try
            {
                return persistencia.Buscar(proceso);
            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }
        }

        /// <summary>
        /// Obtiene un listado con los colaboradores asociados a determinado proceso
        /// Se incluyen solo colaboradores activos
        /// </summary>
        /// <param name="proceso">Proceso a buscar</param>
        /// <returns>Listado de colaboradores. Listado vacio si no hay colaboradores</returns>
        public List<Colaborador> ObtenerColaboradores(Proceso proceso)
        {
            if (proceso == null) throw new Exception("Debe indicar el proceso");

            return persistencia.ObtenerColaboradores(proceso);
        }
    }
}


